\chapter{Módulo de Internacionalização e Localização}\label{capitulo2}

Aplicações web são mais úteis se puderem ser utilizadas por um grande número de usuários, independente do idioma. Internacionalização é uma capacidade cada vez mais necessária em aplicações web visto que a web é mundial.

As possibilidades de difusão de conhecimento pela \textit{World Wide Web} (WWW) estão cada vez mais fazendo parte do processo essencial de diversas áreas de atividade, incluindo comerciais, industriais e educacionais, por exemplo. Visto que sites podem ser acessados por qualquer pessoa de qualquer lugar, é interessante que sejam adicionadas funcionalidades que ajudem em sua aceitação mundial, ou pelo menos em alguns países desejados. Entretanto, para que isso seja viável é necessário introduzir alguns conceitos sobre internacionalização.

São utilizados três termos nesse contexto: globalização, internacionalização e localização \cite{deTroyer2004}. A \textit{Localization Industry Standards Association} (LISA) define os termos da seguinte forma:

\begin{itemize}
 \item Globalização: está preocupada com a capacidade de divulgar algo em diversos países e fazer com que isso seja usável e aplicável nesses países \cite{LisaGlobalization};
 \item Internacionalização: refere-se as tarefas preparatórias para fazer da localização um processo mais simples, rápido, com alta qualidade e custo benefício \cite{LisaInternationalization};
 \item Localização: adiciona contexto cultural a web sites previamente internacionalizados, incluindo a tradução. Tradução é apenas uma das tarefas da localização, entretanto uma das mais custosas, que requer mais tempo de desenvolvimento e essencial para a globalização \cite{LisaLocalization}.
\end{itemize}
Em alguns casos a tradução é utilizada no mesmo contexto que globalização, internacionalização e localização \cite{deTroyer2004}.

De acordo com o \textit{Miniwatts Marketing Group}\footnote{http://www.internetworldstats.com/stats.htm}, em Junho de 2008, a quantidade de usuários da internet no mundo era maior que 1 bilhão e 400 milhões de usuários, sendo mais de 75\% desses concentrados na América do Norte, Europa e Ásia. Estes números justificam o atendimento de usuários com idiomas e culturas diferentes. Outras razões que justificam a publicação de sites multi-idioma \cite{Alvarez1998}:
\begin{itemize}
 \item De uma perspectiva comercial, é possível a pequenas companhias criar facilmente presença global fazendo internacionalização de seus web sites. Do outro lado, grandes companhias não aparentam ser tão competitivas porque não possuem sites internacionalizados;
 \item É uma oportunidade de alcançar parcerias em outros países;
 \item De um ponto de vista acadêmico, pode ser uma maneira de atrair estudantes internacionais para uma Universidade e difundir informações pelo mundo para comunidade acadêmica.
\end{itemize}

Alguns membros do LISA possuem receitas internacionais girando em torno de 70\% de seu faturamento, o que é essencial para suas lideranças mundiais e estratégias comerciais, mostrando a importância da localização para esse cenário \cite{LisaWhy}.
De modo a fornecer aplicações web compreensíveis e obter uma maior aceitação dos usuários, em sistemas multi-idioma, é particularmente interessante incluir características culturais \cite{Ishida2007}.

Considerando que a tradução é uma das tarefas mais custosas, existem diferentes estratégias utilizadas para realizá-la. Por exemplo, existem sistemas automatizados que podem ser encontrados em \textit{Content Management Systems} (CMS) ou implementações específicas para o GNU Gettext \footnote{http://www.gnu.org/software/gettext/}. Apesar desses sistemas serem serem muito efetivos em seus objetivos, existe uma falta de recursos para tradução orientada a pessoas sem conhecimento técnico. Nesses sistemas é necessário que o tradutor conheça não apenas o idioma desejado para a tradução, mas a estrutura de arquivos utilizados para a esse fim. Esse tipo de conhecimento não é comum em pessoas sem conhecimento computacional. É possível que o programador realize a tarefa de tradução, mas essa solução retira ele de sua função original, desenvolver software. Essa situação se torna ainda pior quando o conteúdo do \textit{site} está mapeado em domínios especializados, como por exemplo conteúdo médico ou outra área científica. Logo, buscar por estratégias e ferramentas que ajudem no processo de tradução é a intenção desse módulo.

\section{A Abordagem do SacarWeb}

De modo geral, foi desenvolvida uma ferramenta de tradução embutida no SacarWeb, cuja principal linguagem de desenvolvimento é o PHP. Todo o seu conteúdo original, assim como sua interface está no idioma português brasileiro, mas existe o interesse que esse software seja utilizado por um grande número de usuários, uma vez que um dos objetivos do SacarWeb é a construção de uma grande base de dados clínicos compartilhada entre diversas unidades de cuidados de saúde \cite{Rossi2005}.

Inicialmente, pensando em uma maior aceitação de usuários de diferentes países, foi estabelecido o uso de diferentes padrões de interpretação de exames. Alguns dos exames possuem características relacionadas a internacionalização, como o teste de Função Pulmonar ou o de Pressões Respiratórias. O sistema fornece diferentes equações de valores normais, incluindo diferentes padrões de interpretação: Americano, Europeu e Brasileiro. Logo, foi observado pelos especialistas de saúde e projetistas de software a necessidade de difundir a aplicação em outros países, considerando possíveis parcerias. Este é um caso típico de aplicação web com domínio específico de conhecimento e localização necessária, uma vez que é desejável que o software possa ser utilizado por pesquisadores e institutos clínicos de diferentes países. O grupo que trabalha no software possui pessoas tanto com conhecimento computacional quanto específicos ao domínio da aplicação.

Questões de projeto levantadas para o desenvolvimento desse módulo foram as seguintes:
\begin{itemize}
 \item Facilidade de utilização por parte dos usuários especialistas em saúde;
 \item Fidelidade das traduções, principalmente as relacionadas a termos médicos;
 \item Facilidade de integração com o SacarWeb.
\end{itemize}

\subsection{Arquivos definidos em PHP}
A primeira estratégia utilizada para fornecer uma interface multi-idioma no SacarWeb foi implementada utilizando alguns padrões recomendados pela W3C, que definem \textit{strings} utilizadas no software através de arquivos com definições estáticas. No caso do SacarWeb, isso foi realizado através de codificação de \textit{strings} com PHP. Foi definido um identificador para cada \textit{string} e seu valor no idioma original. Então, deveria ser criado outro arquivo no idioma desejado com os mesmos identificadores para as \textit{strings} traduzidas. O arquivo apropriado seria selecionado conforme o idioma definido pelo usuário. O arquivo definido em PHP deveria ser codificado de acordo com a seguinte sintaxe:

\begin{verbatim}
<?php
    define('Sentence ID', 'Sentence Value');
?> 
\end{verbatim}

A maior desvantagem dessa abordagem é que esse tipo de arquivo só é editável por programadores, uma vez que é definido na linguagem de programação PHP. Essa foi a principal dificuldade identificada pelos projetistas de software, uma vez que o tradutor que iria editar poderia não se sentir livre para realizar essa tarefa. Além disso, gera arquivos extremamente grandes, que podem carregar o servidor web. O gerenciamento de \textit{strings} traduzidas também era dificultado, uma vez que nenhuma ferramenta automatizada para ler esses arquivos foi implementada, como o que ocorre em \textit{eXtensible Markup Language} (XML), por exemplo, através da \textit{Application Programming Interface} (API)  \textit{Document Object Model} (DOM). Logo, os arquivos deveriam ser manipulados manualmente, o que poderia gerar uma grande quantidade de erros.

\subsection{Abordagem utilizando XML}
Face a esta dificuldade, foi proposta e implementada uma ferramenta que acelera a tradução do SacarWeb, cujas idéias podem ser generalizadas para outras aplicações web. Dessa maneira, espera-se que contribua para a internacionalização do SacarWeb.

Durante o projeto do módulo de tradução, foi observado que algumas palavras são de uso geral, como por exemplo as dos botões de navegação, confirmação e mensagens de aviso. Entretanto, existe um grande número de palavras específicas ao domínio de conhecimento da saúde. Considerando essa característica, foi necessário diferenciar entre dois tipos de tradutores: o especialista em saúde e o geral. A participação dos usuários durante o desenvolvimento de uma aplicação é encorajada, uma vez que isso ajuda na aquisição rápida dos requisitos do software \cite{Hulse2004}.

Considerando a necessidade de fornecer ferramentas para os usuários tradutores que freqüentemente não possuem conhecimento técnico para manipular arquivos com uma sintaxe específica, são mostradas algumas alternativas.
Um pacote de software para internacionalização muito utilizado é o \textit{GNU gettext}. Ele consiste em um conjunto de ferramentas integradas para programadores e tradutores.
O conjunto de ferramentas fornece um \textit{framework} que ajuda na produção de mensagens multi-idioma através de outros pacotes GNU (\textit{GNU's not Unix}) e também pode ser utilizado do desenvolvimento de aplicações genéricas. Para utilização do \textit{gettext}, é necessário que o programador identifique as \textit{strings} que serão traduzidas no código fonte do software. Então um arquivo \textit{Portable Object Template} (POT) é gerado. Esse arquivo pretende ser compreensível e editável por humanos, associando cada \textit{string} traduzível de um pacote a sua tradução em particular em um idioma específico. O arquivo POT contém traduções vazias quando é gerado. Dele, derivam os arquivos PO que contém as traduções nos idiomas desejados, sendo um arquivo para cada idioma. Um arquivo PO possui a seguinte estrutura \cite{gettext_manual}.

\begin{verbatim}
 white-space
# translator-comments
#. extracted-comments
#: reference...
#, flag...
#| msgid previous-untranslated-string
msgid untranslated-string
msgstr translated-string
\end{verbatim}

O caracter '\#' denota um comentário. A pessoa responsável pela tradução deve identificar cada ocorrência de uma linha começando pelo 'msgid', que contém a sentença fonte e editar a linha seguinte, iniciada pelo 'msgstr', preenchida com a \textit{string} traduzida correspondente no idioma desejado.
Algumas variações dessa estrutura são possíveis, como por exemplo na identificação de sentenças na forma plural. Verifique abaixo um arquivo \textit{Portable Object} (PO) que utiliza um \textit{Template} PO mais complexo, incluindo o uso do identificador 'msid plural'. Como pode ser observado, o uso de caracteres como '\%d' e identificadores como 'msgstr[0]' pode causar confusão em pessoas responsáveis pela tradução não habituadas a essas terminologias. Esses identificadores não devem ser editados, uma vez que eles são identificadores específicos da sintaxe requerida pelo arquivo de template PO.

\begin{verbatim}
#: src/msgcmp.c:338 src/po-lex.c:699
#, c-format
msgid "found %d fatal error"
msgid_plural "found %d fatal errors"
msgstr[0] "s’ha trobat %d error fatal"
msgstr[1] "s’han trobat %d errors fatals"
\end{verbatim}

Assim que o programador tiver criado o \textit{Template} PO, ele deve editar o código fonte do \textit{software}, especificando as bibliotecas específicas do \textit{gettext} que serão utilizadas. Após isso, um dos programas que fazem parte do \textit{gettext} gera o arquivo contendo as \textit{strings} de origem, com ponteiros para os lugares onde elas serão utilizadas no código fonte do programa. Neste ponto, é gerado um arquivo PO a partir do \textit{template} PO, com todas as traduções necessárias vazias. O tradutor deve editar o arquivo PO, preenchendo o conteúdo dos identificadores 'msgstr'. Essa tarefa pode se tornar mais fácil utilizando editores como o Kbabel\footnote{http://kbabel.kde.org/} ou poEdit\footnote{http://www.poedit.net/}.

Uma das maiores vantagens em utilizar esses editores é que recursos adicionais são oferecidos, como a verificação ortográfica e validação dos arquivos enquanto são editados. Entretanto, é necessário realizar o \textit{download}, instalação, configuração do \textit{software} para começar a utilizar. Mas para isso, ainda é necessário um tempo de aprendizagem para utilização dos editores. Essas necessidades podem desencorajar o tradutor com fluência no idioma desejado.

Apesar de suas dificuldades, o GNU \textit{gettext} é altamente disseminado, visto que é extremamente eficiente no campo de internacionalização. Ele está disponível em diversas linguagens de programação, incluindo o PHP, utilizado no SacarWeb. Em \cite{ibmphp2007} é mostrada a utilização do \textit{gettext} em aplicações web que utilizam PHP, mas a necessidade da edição de arquivos de idioma e código fonte de software não é eliminada. Entretanto, esta é uma das melhores alternativas comparadas as demais.

Outra técnica é proposta em \cite{Parr2006}. Nela, o texto deve ser tratado como um recurso, separando o texto e deixando ele acessível ao tradutor, de maneira dinâmica. A utilização desta técnica é ilustrada em \cite{ibmphp2007} com a linguagem PHP. Nesta abordagem, a manutenção da aplicação se torna mais simples para os programadores. Entretanto, algumas partes expressivas de código \textit{HyperText Markup Language} (HTML) permanecem embutidas em linguagem PHP, o que não é desejável no SacarWeb, pois viola a separação entre camadas de conteúdo, apresentação e comportamento. Uma solução para isso, proposta pelo mesmo autor, é a utilização do \textit{gettext}, que cai novamente nas dificuldades já apresentadas nessa ferramenta. Um arquivo PO para linguagem PHP pode ser definido da seguinte maneira:

\begin{verbatim}
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE’S COPYRIGHT HOLDER
# This file is distributed under the same license as
# the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2006-11-05 11:05-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
#: RSSHandler.php:31
msgid "News type is not valid."
msgstr "Die Nachrichtkategorie
         ist falsch."
\end{verbatim}

Observa-se que junto das traduções de sentenças, existem metadados, escritos entre aspas duplas, o que também pode confundir o tradutor que não possui conhecimento computacional.

Logo, a proposta do módulo de tradução integrado ao SacarWeb é retirar a tarefa dos programadores e passá-la para os tradutores, sem que para estes seja necessário conhecimento de alguma linguagem de programação ou marcação. Esses tradutores, no contexto do SacarWeb, são especialistas médicos e seus alunos. Abstração do processo de edição dos arquivos, certamente aumentará a efetividade do módulo, pois estes usuários terão que utilizar apenas seu conhecimento de um idioma específico dentro de uma interface já conhecida.

A ferramenta de tradução desenvolvida é responsável pelo gerenciamento de todos os idiomas possíveis ao SacarWeb. De acordo com \cite{Ishida2006}, quanto mais um conteúdo é marcado de maneira correta com informações de idioma, mais útil e disseminado ele será.

\subsection{Desenvolvimento}
Durante o projeto da ferramenta, alguns requisitos relacionados ao desenvolvimento foram estabelecidos:
\begin{itemize}
 \item Tratamento do texto como um recurso separado do código HTML, permitindo um acesso fácil pelo tradutor \cite{Parr2006};
 \item É senso comum que aplicações web devem tratar texto e informações sobre imagens como dados dinâmicos, permitindo o tradutor trabalhar de maneira independente;
 \item As palavras do domínio de conhecimento da saúde devem ser traduzidas por pessoal com conhecimento de área, e as palavras de uso geral por pessoas com conhecimento técnico.
\end{itemize}

A ferramenta de tradução de sentenças possui diferentes módulos com objetivos secundários. A  Figura \ref{fig:fluxo_tradutor} mostra o diagrama de fluxo da ferramenta de tradução do SacarWeb.
\begin{figure}[ht!]
    \centering
    \includegraphics[scale=0.2]{./figuras/tradutor.png}
    \caption{Diagrama de Fluxo do Tradutor do SacarWeb}
    \label{fig:fluxo_tradutor}
\end{figure}

O arquivo de sentenças utilizado anteriormente no SacarWeb é a entrada. Ele é codificado em PHP, utilizando definições de constantes, compostas por um identificador e pelo valor da sentença a ser utilizado. Quando uma sentença é necessária, seu identificador deve ser inserido diretamente no código fonte da página. Qualquer modificação deve ser realizada diretamente no arquivo, sendo necessário conhecimento específico da linguagem para realização de operações simples. Um dos objetivos do tradutor é o gerenciamento facilitado de arquivos de tradução.
Devido a extensão desses arquivos de definição, seria uma tarefa muito árdua sua conversão para o formato XML de maneira não automatizada. Para facilitar essa conversão, foi desenvolvido um programa escrito em Java que recebe como entrada esse arquivo PHP, contendo as constantes do SacarWeb, gerando um documento XML, em conformidade com um XML Schema definido. Esse programa basicamente seleciona as \textit{strings} identificadores e seus valores e insere na árvore XML como um novo nó. O arquivo XML deve ser estruturado da seguinte maneira:

\begin{verbatim}
<strings>
   <sentenca xml:id="Sentence ID">
     <traducao xml:lang="pt-BR">Brazilian Portuguese Sentence</traducao>
     <traducao xml:lang="en">English Sentence</traducao>
   </sentenca>
</strings>
\end{verbatim}

A gramática desse documento é controlada por um XML Schema, utilizado para validar a saída do tradutor e o resultado das operações sobre esses arquivos, realizadas posteriormente. O XML Schema que define a gramática que deve ser seguida pode ser consultado no apêndice \ref{schema_sentencas}

Depois disso, foram necessários alguns passos manuais. Esses procedimentos incluem: 
\begin{itemize}
 \item a divisão do arquivo de saída XML em dois tipos de arquivos;
 \begin{itemize}
  \item sentenças utilizadas em escopo geral;
  \item sentenças de escopo específico da saúde;
 \end{itemize}
 \item modificação da aplicação web, considerando que a estratégia anterior para fornecer uma interface multi-idioma foi implementada diretamente em PHP, como descrito anteriormente.
\end{itemize}

Todas as telas foram alteradas para utilizar os métodos associados aos arquivos XML. Foram utilizadas chamadas de métodos de uma classe já existente da aplicação, chamada \textbf{Interface}, responsável por operações na interface. Essa classe, por sua vez, realiza chamadas a classe de tradução, chamada \textbf{Tradutor}, implementada para manipular as sentenças. Essa abordagem tornou mais simples a alteração do código fonte do SacarWeb, uma vez que não era necessário instanciar uma nova classes em todos os arquivos.

A alteração do código fonte da aplicação responsável pela apresentação de dados ocorreu da seguinte forma. Foi necessário alterar todos os arquivos que exibiam algum tipo de texto, visto que anteriormente a implementação do módulo eles utilizavam a chamada de constantes definidas em PHP para exibição dos dados. Todas chamadas de constantes foram alteradas para uma chamada de método, visto que os identificadores utilizados nas constantes PHP eram os mesmos utilizados na identificação em XML. O método da classe \textbf{Interface} chamado \textbf{getSentenca()} recebe o identificador da \textit{string} desejada e retorna a sentença no idioma desejado. Esse trabalho foi simples, mas levou um período razoável, uma vez que a quantidade de arquivos é muito grande. Outro agravante a esse trabalho foi a multiplicidade de fontes de sentenças, divididas entre as específicas de domínio de conhecimento e as gerais, o que necessitou de uma manipulação arquivos simultâneos em apenas um arquivo, necessitando de chamadas de métodos diretos a classe \textbf{Tradutor}.

Finalmente, foram implementadas as telas que manipulam os arquivos XML, utilizadas pelos usuários responsáveis pela tradução. Foram definidos dois tipos de tradutores:

\begin{itemize}
 \item o especialista em saúde, responsáveis pela tradução de sentenças associados aos exames;
 \item o especialista de termos genéricos de aplicações web, responsável pela tradução de sentenças de escopo geral.
\end{itemize}

Através desta separação espera-se atingir uma melhor consistência na tradução, uma vez que expressões técnicas são mais facilmente reconhecidas por um especialista da área, assim como suas possíveis traduções. Espera-se, com essa abordagem, eliminar a necessidade do tradutor conhecer linguagens de programação ou de marcação para poder realizar as traduções de sentenças. Acredita-se que essa seja uma deficiência dos arquivos PO do gettext, que apesar de terem como objetivo serem legíveis por humanos, nem sempre o atíngem, visto que usuários com pouco conhecimento de computação possuem dificuldades para trabalhar com identificadores ou variáveis de linguagens de programação.

\section{Conclusões do Módulo de Internacionalização}
Como apresentado, houve a necessidade da implementação de um módulo de internacionalização devido ao desejo de se aumentar a base de dados do SacarWeb, não se restringindo somente a dados de origem nacional. Esse desejo se deve a necessidade de um banco de dados bem fundamentado para utilização em pesquisas científicas onde o SacarWeb provê uma fonte de dados.

Para alcançar uma maior internacionalização, a aplicação passou pelos processos de globalização, internacionalização e regionalização. O processo de globalização foi pensado desde os requisitos iniciais da aplicação, visto que já haviam planos de utilização de padrões médicos utilizados em diferentes países. Como este processo inclui as fases de internacionalização e localização, iniciamos pela internacionalização, já prevista no projeto do SacarWeb. Pode-se observar em alguns de seus exames, a existência de diferentes padrões de referência, como na Prova de Função Pulmonar (PFP) e no Exame de Pressões Respiratórias que permitem o uso de diferentes padrões de valores considerados normais nos padrões Brasileiro, Americano e Europeu. Esse tipo de prática faz com que a utilização em diferentes países seja melhor aceita, visto que as particularidades de um determinado local estão cobertas pelo software.

Apesar disso, não basta que um determinado processo esteja compatível com um padrão particular se as informações não puderem ser compreendidas devido a uma barreira de idioma. Por isso a localização é crucial para uma aplicação que deseja difusão internacional. Neste aspecto, o SacarWeb implantou uma solução que utiliza XML para armazenar as sentenças nos diversos idiomas atendidos por ele. Para aumentar o sucesso dessa etapa, foi incluída a participação dos usuários no processo de Tradução, para ser mais efetivo devido a presença de sentenças específicas à área da saúde.

Após a implementação deste módulo, ele foi disponibilizado aos usuários e pouco tempo depois, quase 100\% das sentenças específicas à área da saúde já estavam traduzidas para o idioma inglês. Acreditamos que o grau de fidelidade das traduções é alto, visto que apenas usuários especialistas em saúde realizaram este processo. Visto que essa tarefa foi realizada com agilidade, acreditamos que o módulo obteve sucesso, pois seus objetivos foram alcançados. Entre os mais relevantes destaca-se a facilidade dos usuários em ajudar no processo de tradução e a eliminação da necessidade de conhecimentos fora do escopo do idioma traduzido, como seria necessário no GNU Gettext, por exemplo. Também cremos ter alcançado sucesso nas funcionalidades da aplicação devido a sua semelhança com outras do mesmo campo, como pode ser visto na ferramenta de tradução disponível no agregador de projetos open source \textit{launchpad}\footnote{https://translations.launchpad.net/}. A interface disponibilizada no SacarWeb é muito semelhante a do \textit{launchpad}. Entretanto, este oferece uma funcionalidade a mais: a sugestão de uma possível tradução, baseada em traduções fornecidas para a mesma \textit{string} em outros projetos hospedados pelo \textit{site}. Outro resultado interessante alcançado foi a facilidade de integração a aplicação, não sendo necessárias grandes alterações de código fonte para que o módulo entre em funcionamento, diferentemente do GNU Gettext. A figura \ref{fig:busca_sentenca} mostra uma tela de busca de sentenças para um especialista de saúde.
\begin{figure}[htb!]
    \centering
    \includegraphics[scale=0.3]{./figuras/traducao.png}
    \caption{Tela de busca de sentenças}
    \label{fig:busca_sentenca}
\end{figure}
Acreditamos que os resultados alcançados remetem as especificações levantadas para o desenvolvimento do módulo: facilidade na edição das sentenças, abstração de linguagens de programação e/ou marcação e fácil acoplamento da ferramenta, caracterizando então o sucesso do módulo.